using System;
using System.Collections;
using System.Data;
using System.Data.SqlClient;
using Microsoft.ApplicationBlocks.Data;
using Common;
using DataAccess;
using SystemFrameworks;

namespace BusinessRules
{
	/// <summary>
	/// Clase de acceso a datos para la entidad Demoras
	/// </summary>
	public class Encuestas : SINIC
	{
		#region Private Data Access Atributes

		private const String ARE_ID_PARAM = "@ARE_ID";
		private const String SEC_ID_PARAM = "@SEC_ID";
		private const String ENC_ID_PARAM = "@ENC_ID";
		private const String ENC_TITULO_PARAM = "@ENC_TITULO";
		private const String ENC_ESTADO_PARAM = "@ENC_ESTADO";
		private const String ENC_FECHA_INICIAL_PARAM = "@ENC_FECHA_INICIAL";
		private const String ENC_FECHA_FINAL_PARAM = "@ENC_FECHA_FINAL";
		private const String ENC_FECHA_HISTORICO_PARAM = "@ENC_FECHA_HISTORICO";
		private const String ENC_HOME_PARAM = "@ENC_HOME";
		private const String ENC_PRESENTA_PUBLICO_PARAM = "@ENC_PRESENTA_PUBLICO";
		private const String ENC_ESTADO_MODULO_PARAM = "@ENC_ESTADO_MODULO";
		private const String STR_ID_PARAM = "@STR_ID";

		#endregion Private Data Access Atributes

		/// <summary>
		/// Constructor de la clase Mod_encuestas
		/// </summary>
        public Encuestas(string strCadenaConecxion)
		{
            CadenaConexion = strCadenaConecxion;
		}

        private string _CadenaConexion;

        public string CadenaConexion
        {
            get { return _CadenaConexion; }
            set { _CadenaConexion = value; }
        }

		public EncuestasData BuscarEncuestas(string strCadenaConecxion)
		{
			EncuestasData response = new EncuestasData();
			SqlHelper.ExecuteDataTable(CadenaConexion, CommandType.StoredProcedure, "PAS_MOD_BUSCAR_ENCUESTAS", response.Tables[0]);
			if (response.Tables[0].Rows.Count == 0)
				return null;
			return response;
		}

		public EncuestasData BuscarEncuestas(DataRow row)
		{
			EncuestasData response = new EncuestasData();

			SqlParameter param1 = new SqlParameter(SEC_ID_PARAM, row[EncuestasData.SEC_ID_FIELD]);
			SqlParameter param2 = new SqlParameter(ENC_TITULO_PARAM, row[EncuestasData.ENC_TITULO_FIELD]);
			SqlParameter param3 = new SqlParameter(ENC_ESTADO_PARAM, row[EncuestasData.ENC_ESTADO_FIELD]);
			SqlParameter param4 = new SqlParameter(ENC_FECHA_HISTORICO_PARAM, row[EncuestasData.ENC_FECHA_HISTORICO_FIELD]);
			SqlParameter param5 = new SqlParameter(ENC_HOME_PARAM, row[EncuestasData.ENC_HOME_FIELD]);
			SqlParameter param6 = new SqlParameter(ARE_ID_PARAM, row[EncuestasData.ARE_ID_FIELD]);
			SqlParameter[] parameters = {param1, param2, param3, param4, param5, param6};
			SqlHelper.ExecuteDataTable(CadenaConexion, CommandType.StoredProcedure, "PAS_BUSCAR_MOD_ENCUESTAS_ADMIN", response.Tables[0], parameters);
			if (response.Tables[0].Rows.Count == 0)
				return null;
			return response;
		}

		public EncuestasData ConsultarEncuestas(string Id)
		{
			EncuestasData response = new EncuestasData();
			SqlParameter param1 = new SqlParameter(ENC_ID_PARAM, Id);
			SqlParameter[] parameters = {param1};
			SqlHelper.ExecuteDataTable(CadenaConexion, CommandType.StoredProcedure, "PAS_CONSULTAR_MOD_ENCUESTAS", response.Tables[0], parameters);
			if (response.Tables[0].Rows.Count == 0)
				return null;
			return response;
		}


		public void CambiarEstadoEncuestasSinic(string IDENCUESTA, string Estado)
		{
			try
			{
				SqlParameter param1 = new SqlParameter(ENC_ID_PARAM, IDENCUESTA);
				SqlParameter param2 = new SqlParameter(ENC_ESTADO_MODULO_PARAM, Estado);
				SqlParameter[] parameters = {param1, param2};
				SqlHelper.ExecuteNonQuery(CadenaConexion, CommandType.StoredProcedure, "PAS_CAMBIAR_ESTADO_MOD_ENCUESTAS_SINIC", parameters);
			}
			catch (Exception ex)
			{
				throw new ApplicationExceptionManager(Utilidad.TraerMensaje("gmsgErrorActualizar", "Encuestas"), ex);
			}

		}

		public EncuestasData ConsultarEncuestaHome(string IdSec)
		{
			EncuestasData response = new EncuestasData();
			SqlParameter param1 = new SqlParameter(SEC_ID_PARAM, IdSec);
			SqlParameter[] parameters = {param1};
			SqlHelper.ExecuteDataTable(CadenaConexion, CommandType.StoredProcedure, "PAS_CONSULTAR_MOD_ENCUESTA_HOME", response.Tables[0], parameters);
			if (response.Tables[0].Rows.Count == 0)
				return null;
			return response;
		}

		public EncuestasData ConsultarEncuestasSeccion(string IdAre, string IdSec)
		{
			EncuestasData response = new EncuestasData();
			SqlParameter param1 = new SqlParameter(ARE_ID_PARAM, IdAre);
			SqlParameter param2 = new SqlParameter(SEC_ID_PARAM, IdSec);
			SqlParameter[] parameters = {param1, param2};
			SqlHelper.ExecuteDataTable(CadenaConexion, CommandType.StoredProcedure, "PAS_CONSULTAR_MOD_ENCUESTAS_SECCION", response.Tables[0], parameters);
			if (response.Tables[0].Rows.Count == 0)
				return null;
			return response;
		}
		public EncuestasData ConsultarEncuestasSeccion(string IdAre, string IdSec, string appSinic, string prePublico)
		{
			EncuestasData response = new EncuestasData();
			SqlParameter param1 = new SqlParameter(ARE_ID_PARAM, IdAre);
			SqlParameter param2 = new SqlParameter(SEC_ID_PARAM, IdSec);
			/*SqlParameter param3 = new SqlParameter(ENC_PRESENTA_PUBLICO_PARAM, prePublico);
			SqlParameter param4 = new SqlParameter(ENC_ESTADO_MODULO_PARAM, appSinic);*/
			SqlParameter[] parameters = {param1, param2};
			SqlHelper.ExecuteDataTable(CadenaConexion, CommandType.StoredProcedure, "PAS_CONSULTAR_MOD_ENCUESTAS_SECCION", response.Tables[0], parameters);
			if (response.Tables[0].Rows.Count == 0)
				return null;
			return response;
		}

		public EncuestasData ConsultarEncuestasSeccionHistorico(string IdAre, string IdSec)
		{
			EncuestasData response = new EncuestasData();
			SqlParameter param1 = new SqlParameter(ARE_ID_PARAM, IdAre);
			SqlParameter param2 = new SqlParameter(SEC_ID_PARAM, IdSec);
			SqlParameter[] parameters = {param1, param2};
			SqlHelper.ExecuteDataTable(CadenaConexion, CommandType.StoredProcedure, "PAS_CONSULTAR_MOD_ENCUESTAS_SECCION_HISTORICAS", response.Tables[0], parameters);
			if (response.Tables[0].Rows.Count == 0)
				return null;
			return response;
		}

		public decimal AdicionarEncuestas(EncuestasData datos)
		{
			decimal intEnc_Id = 0;
			DataTable tabla = datos.Tables[EncuestasData.MOD_ENCUESTAS_TABLE];
			SqlConnection objConnection = new SqlConnection(CadenaConexion);
			objConnection.Open();
			SqlTransaction objTrans = objConnection.BeginTransaction(IsolationLevel.Serializable);
			try
			{
				foreach (DataRow row in tabla.Rows)
				{
					SqlParameter param1 = new SqlParameter(ENC_ID_PARAM, SqlDbType.Decimal);
					param1.Direction = ParameterDirection.Output;
					SqlParameter param2 = new SqlParameter(ARE_ID_PARAM, row[EncuestasData.ARE_ID_FIELD]);
					SqlParameter param3 = new SqlParameter(SEC_ID_PARAM, row[EncuestasData.SEC_ID_FIELD]);
					SqlParameter param4 = new SqlParameter(ENC_TITULO_PARAM, row[EncuestasData.ENC_TITULO_FIELD]);
					SqlParameter param5 = new SqlParameter(ENC_ESTADO_PARAM, row[EncuestasData.ENC_ESTADO_FIELD]);
					SqlParameter param6 = new SqlParameter(ENC_FECHA_INICIAL_PARAM, row[EncuestasData.ENC_FECHA_INICIAL_FIELD]);
					SqlParameter param7 = new SqlParameter(ENC_FECHA_FINAL_PARAM, row[EncuestasData.ENC_FECHA_FINAL_FIELD]);
					SqlParameter param8 = new SqlParameter(ENC_FECHA_HISTORICO_PARAM, row[EncuestasData.ENC_FECHA_HISTORICO_FIELD]);
					SqlParameter param9 = new SqlParameter(ENC_HOME_PARAM, row[EncuestasData.ENC_HOME_FIELD]);
					SqlParameter param10 = new SqlParameter(ENC_PRESENTA_PUBLICO_PARAM, row[EncuestasData.ENC_PRESENTA_PUBLICO_FIELD]);
					SqlParameter param11 = new SqlParameter(ENC_ESTADO_MODULO_PARAM, row[EncuestasData.ENC_ESTADO_MODULO_FIELD]);
					SqlParameter[] parameters = {param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11};
					SqlHelper.ExecuteNonQuery(CadenaConexion, CommandType.StoredProcedure, "PAS_ADICIONAR_MOD_ENCUESTAS", parameters);
					intEnc_Id = decimal.Parse(param1.Value.ToString());
				}
				objTrans.Commit();
			}
			catch (SqlException sqlEx)
			{
				objTrans.Rollback();
				throw new ApplicationExceptionManager(Utilidad.DisplaySqlErrors(sqlEx, "Entidades"), sqlEx);
			}
			catch (Exception ex)
			{
				objTrans.Rollback();
				throw new ApplicationExceptionManager(Utilidad.TraerMensaje("gmsgErrorInsertar", "Entidades"), ex);
			}
			finally
			{
				objConnection.Close();
			}
			return (intEnc_Id);
		}

		public void ActualizarEncuestas(EncuestasData datos)
		{
			DataTable tabla = datos.Tables[EncuestasData.MOD_ENCUESTAS_TABLE];
			try
			{
				foreach (DataRow row in tabla.Rows)
				{
					SqlParameter param1 = new SqlParameter(ENC_ID_PARAM, row[EncuestasData.ENC_ID_FIELD]);
					SqlParameter param2 = new SqlParameter(ENC_TITULO_PARAM, row[EncuestasData.ENC_TITULO_FIELD]);
					SqlParameter param3 = new SqlParameter(ENC_ESTADO_PARAM, row[EncuestasData.ENC_ESTADO_FIELD]);
					SqlParameter param4 = new SqlParameter(ENC_FECHA_INICIAL_PARAM, row[EncuestasData.ENC_FECHA_INICIAL_FIELD]);
					SqlParameter param5 = new SqlParameter(ENC_FECHA_FINAL_PARAM, row[EncuestasData.ENC_FECHA_FINAL_FIELD]);
					SqlParameter param6 = new SqlParameter(ENC_FECHA_HISTORICO_PARAM, row[EncuestasData.ENC_FECHA_HISTORICO_FIELD]);
					SqlParameter param7 = new SqlParameter(ENC_HOME_PARAM, row[EncuestasData.ENC_HOME_FIELD]);
					SqlParameter param8 = new SqlParameter(ENC_PRESENTA_PUBLICO_PARAM, row[EncuestasData.ENC_PRESENTA_PUBLICO_FIELD]);
					SqlParameter param9 = new SqlParameter(ENC_ESTADO_MODULO_PARAM, row[EncuestasData.ENC_ESTADO_MODULO_FIELD]);
					SqlParameter param10 = new SqlParameter(SEC_ID_PARAM, row[EncuestasData.SEC_ID_FIELD]);
					SqlParameter[] parameters = {param1, param2, param3, param4, param5, param6, param7, param8, param9, param10};
					SqlHelper.ExecuteNonQuery(CadenaConexion, CommandType.StoredProcedure, "PAS_ACTUALIZAR_MOD_ENCUESTAS", parameters);
				}
			}
			catch (Exception ex)
			{
				throw new ApplicationExceptionManager(Utilidad.TraerMensaje("gmsgErrorActualizar", "Encuestas"), ex);
			}
		}

		/// <summary>
		/// Elimina un registro de la entidad
		/// </summary>
		/// <param name="Id">Identificador del registro</param>
		public void Eliminarncuestas(string Id)
		{
			try
			{
				SqlParameter param1 = new SqlParameter(ENC_ID_PARAM, Id);
				SqlParameter[] parameters = {param1};
				SqlHelper.ExecuteNonQuery(CadenaConexion, CommandType.StoredProcedure, "PAS_ELIMINAR_MOD_ENCUESTAS", parameters);
			}
			catch (Exception ex)
			{
				throw new ApplicationExceptionManager(Utilidad.TraerMensaje("gmsgErrorEliminar", "Encuestas"), ex);
			}
		}

		public void Eliminarncuestas(ArrayList arrIDs)
		{
			EncuestasPreguntas  objControlP  = new EncuestasPreguntas(CadenaConexion);
            EncuestasRespuestas objControlR = new EncuestasRespuestas(CadenaConexion);	

			StartTransaction();	
			#region 1. Elimina cada Registro
			try
			{
				objControlR.EliminarEncuestasRespuestas(arrIDs);
				objControlP.EliminarEncuestasPreguntas(arrIDs);

				foreach (object Item in arrIDs)
				{
					EliminarEncuestaServicio( Item.ToString() ); 

					SqlParameter param1 = new SqlParameter(ENC_ID_PARAM, decimal.Parse(Item.ToString()));
					SqlParameter[] parameters = {param1};
					SqlHelper.ExecuteNonQuery(CadenaConexion, CommandType.StoredProcedure, "PAS_ELIMINAR_MOD_ENCUESTAS", parameters);
	
				}
				 

			}
			catch (SqlException sqlEx)
			{
				AbortTransaction();
				throw new ApplicationExceptionManager(Utilidad.DisplaySqlErrors(sqlEx, "Encuestas"), sqlEx);
			}
			catch (Exception ex)
			{
				AbortTransaction();
				throw new ApplicationExceptionManager(Utilidad.TraerMensaje("gmsgErrorEliminar", "Encuestas"), ex);
			}
			#endregion
			#region 2. Registrar Auditoria
			if ((this.RegistroAuditoria!=null)&&(RegistroAuditoria.Rows.Count > 0))
			{						
				try
				{
					RegistrarAuditoria();
				}
				catch (Exception ex)
				{
					AbortTransaction();
					throw new ApplicationExceptionManager(ex.Message, ex);
				}
			}
			#endregion
			
			CompleteTransaction();
		}

		public bool EliminarEncuestaServicio(string idEncuesta )  
		{
			bool resultado = false;
			try
			{				 					 
				SqlParameter param1 = new SqlParameter(ENC_ID_PARAM, idEncuesta);
				SqlParameter param2 = new SqlParameter(ARE_ID_PARAM, DBNull.Value);
				SqlParameter param3 = new SqlParameter(SEC_ID_PARAM, DBNull.Value);
				SqlParameter[] parameters = {param1, param2, param3 };
				SqlHelper.ExecuteNonQuery( CadenaConexion  , CommandType.StoredProcedure, "PAS_ELIMINAR_MOD_ENCUESTAS_SERVICIOS", parameters);
				resultado = true;				
			}
			catch (SqlException sqlEx)
			{				
				throw new ApplicationExceptionManager(Utilidad.DisplaySqlErrors(sqlEx, "EncuestaServicio"), sqlEx);
			}
			catch (Exception ex)
			{
				throw new ApplicationExceptionManager(Utilidad.TraerMensaje("gmsgErrorInsertar", "EncuestaServicio"), ex);
			}
			
			return resultado;
		}
		public void CambiarEstado(string[] strIds, Utilidad.EstadosAprobacion estado)
		{
			StartTransaction();

			foreach(string strId in strIds)
			{

				#region 1. Actualiza registro
				try
				{			
					SqlParameter param1 = new SqlParameter(STR_ID_PARAM, strId);
					SqlParameter param2 = new SqlParameter(ENC_ESTADO_PARAM, EnumHelper.GetDescription(estado));
					SqlParameter[] parameters = {param1, param2};
					SqlHelper.ExecuteNonQuery(CadenaConexion, CommandType.StoredProcedure, "PAS_CAMBIAR_ESTADO_MOD_ENCUESTAS", parameters);
				}
				catch (SqlException sqlEx)
				{
					AbortTransaction();
					throw new ApplicationExceptionManager(Utilidad.DisplaySqlErrors(sqlEx, "Entidades"), sqlEx);
				}
				catch (Exception ex)
				{
					AbortTransaction();
					
					if (estado == Utilidad.EstadosAprobacion.Activo)
					{
						throw new ApplicationExceptionManager(Utilidad.TraerMensaje("gmsgAprobarRegistrosExitoso", "Encuestas"), ex);
					}
					else
					{
						throw new ApplicationExceptionManager(Utilidad.TraerMensaje("gmsgDesaprobarRegistrosExitoso", "Encuestas"), ex);
					}
				}
				#endregion 
			}


			#region 2. Registra Auditoria
						 
			try
			{
				if ((this.RegistroAuditoria!=null)&&(RegistroAuditoria.Rows.Count > 0))
				{
					RegistrarAuditoria();
				}
			}
			catch (Exception ex)
			{
				AbortTransaction();
				throw new ApplicationExceptionManager(ex.Message,ex);				
			}			 
			 
			#endregion

			CompleteTransaction();

		}
	}
}